home *** CD-ROM | disk | FTP | other *** search
- {
- I found a source * COPY.PAS * (don't know where anymore or who posted it) and
- tried to Write my own move_Files Program based on it.
-
- The simple idea is to move the Files specified in paramstr(1) to a destination
- directory specified in paramstr(2) and create the directories that do not yet
- exist.
-
- On a first look it seems just to work out ok. But yet it does not.
-
- to help me find the failure set paramstr(1) to any path you want (For example
- D:\test\*.txt or whatever) and set paramstr(2) to a non existing path which is
- C:\A\B\C\D\E\F\G\H\..\Z\A\B\C\D\E\F\
-
- The directories C:\A through C:\A\B\C\D\F\..\Q\R\S will be created and than the
- Program hangs.
-
- Who can help me find what the mistake is?
-
- I Really will be grateful For any kind of help.
-
- The code is:
- }
-
- {$A+,B-,D+,E+,F-,G-,I-,L+,N-,O-,R+,S-,V+,X-}
- Program aMOVE;
-
- Uses
- Crt, Dos;
- Const
- BufSize = 32768;
- Var
- ioCode : Byte;
- SrcFile, DstFile : File;
- FileNameA,
- FileNameB : String;
- Buffer : Array[1..BufSize] of Byte;
- RecsRead : Integer;
- DiskFull : Boolean;
- CurrDir : DirStr; {Aktuelles Verzeichnis speichern}
- HelpList : Boolean; {Hilfe uber mogliche Parameter?}
- i,
- n : Integer;
- str : String[1];
-
- SDStr : DirStr; {Quellverzeichnis}
- SNStr : NameStr; {Quelldateiname}
- SEStr : ExtStr; {Quelldateierweiterung}
-
- DDStr : DirStr; {Zielverzeichnis}
- DNStr : NameStr; {Zieldateiname}
- DEStr : ExtStr; {Zieldateierweiterung}
-
- SrcInfo : SearchRec; {Liste der Quelldateien}
- SubDirStr : Array [0..32] of DirStr;
- key : Char;
-
-
- Procedure SrcFileError(ioCode : Byte);
- begin
- Write(#7, 'I/O result of ', ioCode, ' (decimal) ', #26);
- Case ioCode of
- $01 : WriteLn(' Source File not found.');
- $F3 : WriteLn(' too many Files open.');
- else WriteLn(' "Reset" unknown I/O error.');
- end;
- end;
-
- Procedure DstFileError(ioCode : Byte);
- begin
- Write(#7, 'I/O result of ', ioCode, ' (decimal) ', #26);
- Case ioCode of
- $F0 : WriteLn(' Disk data area full.');
- $F1 : WriteLn(' Disk directory full.');
- $F3 : WriteLn(' too many Files open.');
- else WriteLn(' "ReWrite" unknown I/O error.');
- end;
- end;
-
-
-
- Procedure EXPAR; {externe Parameter abfragen} begin
- GetDir(0,CurrDir); {Aktuelles Verzeichnis speichern}
- if DDStr='' then DDStr:= CurrDir; {Wenn keine Zialangabe, dann ins
- aktuelle Verzeichnis verschieben}
- FSplit(paramstr(1), SDStr, SNStr, SEStr);
- end;
-
- Procedure Copy2Dest;
- begin
- if FileNameB <> FileNameA then
- begin
- Assign(SrcFile, FileNameA);
- Assign(DstFile, FileNameB);
- {* note second parameter in "reset" and "reWrite" of UNTyped Files. *}
- {$I-} Reset(SrcFile, 1); {$I+}
- ioCode := Ioresult;
- if (ioCode <> 0) then SrcFileError(ioCode)
- else
- begin
- {$I-} ReWrite(DstFile, 1); {$I+}
- ioCode := Ioresult;
- if (ioCode <> 0) then DstFileError(ioCode)
- else
- begin
- DiskFull := False;
- While (not EoF(SrcFile)) and (not DiskFull) do
- begin
- {* note fourth parameter in "blockread". *}
- {$I-}
- BlockRead(SrcFile, Buffer, BufSize, RecsRead);
- {$I+}
- ioCode := Ioresult;
- if ioCode <> 0 then
- begin
- SrcFileError(ioCode);
- DiskFull := True
- end
- else
- begin
- {$I-}
- BlockWrite(DstFile, Buffer, RecsRead);
- {$I+}
- ioCode := Ioresult;
- if ioCode <> 0 then
- begin
- DstFileError(ioCode);
- DiskFull := True
- end
- end
- end;
- if not DiskFull then WriteLn(FileNameB)
- end;
- Close(DstFile)
- end;
- Close(SrcFile)
- end
- else WriteLn(#7, 'File can not be copied onto itself.')
- end;
-
- Procedure ProofDest;
- begin
- if length(paramstr(2)) > 67 then begin
- Writeln;
- Writeln(#7,'Invalid destination directory specified.');
- Writeln('Program aborted.');
- Halt(1);
- end;
- FSplit(paramstr(2), DDStr, DNStr, DEStr);
- if copy(DNStr,length(DNStr),1)<>'.' then begin
- insert(DNStr,DDStr,length(DDStr)+1);
- DNStr:='';
- end;
- if copy(DDStr,length(DDStr),1)<>'\' then
- insert('\',DDSTR,length(DDStr)+1);
- SubDirStr[0]:= DDStr;
- For i:= 1 to 20 do begin
- SubDirStr[i]:=copy(DDStr,1,pos('\',DDStr));
- Delete(DDStr,1,pos('\',DDStr));
- end;
- For i:= 32 doWNto 1 do begin
- if SubDirStr[i]= '' then n:= i-1;
- end;
-
- DDStr:= SubDirStr[0];
- SubDirStr[0]:='';
-
- For i:= 1 to n do begin
- SubDirStr[0]:= SubDirStr[0]+SubDirStr[i];
-
- if copy(SubDirStr[0],length(SubDirStr[0]),1)='\' then
- delete(SubDirStr[0],length(SubDirStr[0]),1);
-
- begin
- {$I-}
- MkDir(SubDirStr[0]);
- {$I+}
- if Ioresult = 0 then
- WriteLn('New directory created: ', SubDirStr[0]);
- end;
-
- if copy(SubDirStr[0],length(SubDirStr[0]),1)<>'\' then
- insert('\',SubDirStr[0],length(SubDirStr[0])+1);
- end;
- end;
-
- Procedure HandleMove;
- begin
- FileNameA:= SDStr+SrcInfo.Name;
- FileNameB:= DDStr+SrcInfo.Name;
- Copy2Dest;
- Erase(SrcFile);
- end;
-
- Procedure ExeMove;
- begin
- ProofDest;
- FindFirst(paramstr(1), AnyFile, SrcInfo);
- While DosError = 0 do begin
- HandleMove;
- FindNext(SrcInfo);
- end;
- end;
-
-
-
- begin
- SDStr:= '';
- SNStr:= '';
- SEStr:= '';
- DDStr:= '';
- DNStr:= '';
- DEStr:= '';
- For i:=0 to 32 do SubDirStr[i]:='';
- ExPar;
- ExeMove;
- end.